struct _GtkCssScannerPrivate
{
+ GFile *file;
GSList *state;
GSList *cur_selectors;
GHashTable *cur_properties;
gtk_css_scanner_reset (scanner);
+ if (priv->file)
+ g_object_unref (priv->file);
g_hash_table_destroy (priv->cur_properties);
g_slice_free (GtkCssScannerPrivate, priv);
}
static GScanner *
-gtk_css_scanner_new (void)
+gtk_css_scanner_new (GFile *file,
+ const gchar *data,
+ gsize length)
{
GtkCssScannerPrivate *priv;
GScanner *scanner;
priv = scanner->user_data = g_slice_new0 (GtkCssScannerPrivate);
+ if (file)
+ priv->file = g_object_ref (file);
+
priv->cur_properties = g_hash_table_new_full (g_str_hash,
g_str_equal,
(GDestroyNotify) g_free,
scanner_apply_scope (scanner, SCOPE_SELECTOR);
+ if (length > G_MAXUINT32)
+ g_warning ("CSS file too large, truncating");
+
+ g_scanner_input_text (scanner, data, length);
+
return scanner;
}
GScanner *scanner,
GError *error)
{
- const char *filename;
+ char *filename;
guint line, position;
if (scanner)
{
- filename = scanner->input_name;
+ GtkCssScannerPrivate *priv = scanner->user_data;
+ if (priv->file)
+ filename = g_file_get_path (priv->file);
+ else
+ filename = NULL;
line = scanner->line;
position = scanner->position;
}
g_signal_emit (provider, css_provider_signals[PARSING_ERROR], 0,
filename, line, position, error);
+ g_free (filename);
g_error_free (error);
}
gtk_css_provider_reset (css_provider);
- scanner = gtk_css_scanner_new ();
-
- scanner->input_name = NULL;
- g_scanner_input_text (scanner, data, (guint) length);
+ scanner = gtk_css_scanner_new (NULL, data, length);
result = parse_stylesheet (css_provider, scanner, error);
{
GError *internal_error = NULL;
GScanner *scanner;
- char *path;
gchar *data;
gsize length;
gboolean ret;
gtk_css_provider_reset (css_provider);
- scanner = gtk_css_scanner_new ();
-
- path = g_file_get_path (file);
- scanner->input_name = path;
- g_scanner_input_text (scanner, data, (guint) length);
+ scanner = gtk_css_scanner_new (file, data, length);
ret = parse_stylesheet (css_provider, scanner, error);
- g_free (path);
g_free (data);
gtk_css_scanner_destroy (scanner);
GScanner *scanner;
const gchar *data;
gsize length;
+ GFile *file;
gboolean ret;
priv = css_provider->priv;
if (reset)
gtk_css_provider_reset (css_provider);
- scanner = gtk_css_scanner_new ();
- scanner->input_name = path;
- g_scanner_input_text (scanner, data, (guint) length);
+ file = g_file_new_for_path (path);
+ scanner = gtk_css_scanner_new (file, data, length);
+ g_object_unref (file);
ret = parse_stylesheet (css_provider, scanner, error);